#include "AlfaBeta.h"
#include <limits.h>

#define MAX(s,t)      ((s)>(t)?(s):(t))
#define MIN(s,t)      ((s)<(t)?(s):(t))

AlfaBeta::AlfaBeta() {
}

int AlfaBeta::BuscarAlfaBeta(Nodo *nodo, int profundidad, int a, int b, bool juegaNegro) {
    if (nodo->esTerminal() || (profundidad == 0)) {
        return nodo->Valor();
    }

    //Iterador de los hijos:
    Nodo::Iterador it(nodo);
    Nodo hijo;
    
    --profundidad;
    
    while (it.Siguiente(&hijo)) {
        nodGen++;
        if (juegaNegro)
            a = MAX(a, BuscarAlfaBeta(&hijo, profundidad, a, b, false));
        else
            b = MIN(b, BuscarAlfaBeta(&hijo, profundidad, a, b, true));
        
        if (b <= a) break;
    }
    
    return juegaNegro ? a : b;
}


int AlfaBeta::Buscar(Nodo *nodo, int profundidad, bool juegaNegro) {
    nodGen = 0;
    return BuscarAlfaBeta(nodo, profundidad, INT_MIN, INT_MAX , juegaNegro);
}

int AlfaBeta::NodGen() const { return nodGen; }

AlfaBeta::~AlfaBeta() {
}
